package zdream.control.graphics;

import zdream.control.core.IDisposable;
import zdream.control.world.Ticker;

/**
 * 分成两个画布, 一个是画世界的, 另一个是画符号的, 都是 IPainter.
 * @author Zdream
 * @date (created) 2021-09-09   (last modified) 2022-09-02
 */
public interface IPainter extends IDisposable, Comparable<IPainter> {

	default boolean hasLoaded() { return true; }

	/**
	 * <p>因为 Painter 是需要获取 Texture 等资源的,
	 * 但考虑到 Texture 只能在主线程初始化, 而 case 启动的时候
	 * 基本上不在主线程, 所以单独开一个方法 load 来处理 OpenGL 资源获取.
	 * <p>游戏执行时, load 方法由 LevelGraphic 类来调用;
	 * 跑 case 时不调用该方法
	 * </p>
	 */
	default void load() {}
	
	void draw(Ticker time);
	
	/**
	 * <p>越高的在前面. (后绘制)
	 * <p>洛克人: 1000
	 * <p>一般的怪: 501 - 700
	 * </p>
	 */
	int zIndex();

	/**
	 * @return
	 *  如果不想让它画了, return false 就行了
	 */
	default boolean isEnable() {
		return true;
	}

	/**
	 * 当启用时, 也就是放到 LevelGraphics 时触发
	 */
	default void onApply() {}

	/**
	 * 当从 LevelGraphics 删除时触发
	 */
	default void onRemove() {}

	default int compareTo(IPainter other) {
		return Integer.compare(this.zIndex(), other.zIndex());
	}
}
